[okyungjin] WEEK 01 Solutions#2653
Conversation
📊 okyungjin 님의 학습 현황이번 주 제출 문제
누적 학습 요약
문제 풀이 현황
🤖 이 댓글은 GitHub App을 통해 자동으로 작성되었습니다. 🔢 API 사용량 (gpt-5-nano)
|
Constraint: Commit only the requested contains-duplicate/okyungjin.py change Confidence: medium Scope-risk: narrow Directive: Keep LeetCode solution files scoped to one problem and one author file Tested: Reviewed staged diff for contains-duplicate/okyungjin.py Not-tested: Did not run solution because requested operation was commit-only
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Hash Map / Hash Set, Two Pointers
- 설명: 정렬 후 인접 중복을 확인하는 방식은 Two Pointers의 변형으로 간주 가능하며, 두 번째 구현은 해시 집합(Hash Set)으로 중복 탐지를 수행한다. 두 가지 모두 중복 여부를 빠르게 판단하는 패턴이다.
📊 시간/공간 복잡도 분석
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(nlogN) | O(n) | ❌ |
| Space | O(nlogN) | O(1) | ❌ |
피드백: 정렬 풀이와 해시셋 풀이 두 가지가 제시되어 있습니다. 두 방법 모두 한 번의 선형 스캔으로 중복 여부를 확인합니다.
개선 제안: 현재 구현이 적절해 보입니다.
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Dynamic Programming, Greedy
- 설명: 연속한 주택을 건너뛰고 최대 이익을 얻는 문제로, 각 위치까지의 최적 부분해를 저장하는 DP 패턴을 사용합니다. 또한 선택과 비교로 최댓값을 갱신하는 방식은 그리디 성격도 보이며, 공간을 O(1)로 유지합니다.
📊 시간/공간 복잡도 분석
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(N) | O(n) | ✅ |
| Space | O(1) | O(1) | ✅ |
피드백: 연속 여부를 판단하며 두 이전 상태만 유지하는 최적화된 동적계획법 구현입니다.
개선 제안: 현재 구현이 적절해 보입니다.
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Greedy, Dynamic Programming, Sort
- 설명: 정렬과 연속 여부 판단으로 최댓값을 갱신하는 방식으로 문제를 해결한다. 시간 복잡도 목표는 O(N)이나 구현은 정렬(O(N log N))를 사용하고, 연속 부분 문자열처럼 길이를 추적하며 최댓값을 업데이트하는 아이디어가 Greedy 성격에 가깝다.
📊 시간/공간 복잡도 분석
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(n log n) | O(n log n) | ✅ |
| Space | O(N) | O(1) | ❌ |
피드백: 정렬 후 순회로 연속 부분 수열의 길이를 계산합니다. 중복 처리도 포함되어 있습니다.
개선 제안: 가능하면 해시셋 기반의 선형 해법으로 개선 여지가 있습니다.
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Hash Map / Hash Set, Heap / Priority Queue, Greedy, Dynamic Programming
- 설명: 코드에서 빈도수를 세기 위해 해시 맵(Counter/dict)을 사용하고, 상위 k개를 뽑기 위해 최소힙(heapq) 등 여러 방법으로 정렬/선정하는 구조를 보인다. 부분적으로 최적해 도출과 부분집합 추출이 핵심이며, 빈도 기반의 선택은 그리디적 요소도 포함한다.
📊 시간/공간 복잡도 분석
ℹ️ 이 파일에는 4가지 풀이가 포함되어 있어 각각 분석합니다.
풀이 1: SolutionA.topKFrequent — Time: ✅ O(nlogK) → O(n log k) / Space: ✅ O(N) → O(n)
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(nlogK) | O(n log k) | ✅ |
| Space | O(N) | O(n) | ✅ |
피드백: Counter를 활용한 간결한 구현이며, 가장 많이 쓰이는 접근 방식입니다.
개선 제안: 현재 구현이 적절해 보입니다.
풀이 2: SolutionB.topKFrequent — Time: ✅ O(nlogN) → O(n log n) / Space: ✅ O(N) → O(n)
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(nlogN) | O(n log n) | ✅ |
| Space | O(N) | O(n) | ✅ |
피드백: 간단하지만 n이 커질 때 비효율적일 수 있습니다.
개선 제안: 현재 구현이 적절해 보입니다.
풀이 3: SolutionC.topKFrequent — Time: ✅ O(N) → O(n) / Space: ✅ O(N) → O(n)
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(N) | O(n) | ✅ |
| Space | O(N) | O(n) | ✅ |
피드백: 빈도별 버킷을 사용해 선형 시간 복잡도로 상위 k개를 찾습니다.
개선 제안: 현재 구현이 적절해 보입니다.
풀이 4: SolutionD.topKFrequent — Time: ❌ O(N logN) → O(n log k) / Space: ✅ O(N) → O(n)
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(N logN) | O(n log k) | ❌ |
| Space | O(N) | O(n) | ✅ |
피드백: 메모리 대비 속도 면에서 균형 있는 방법입니다.
개선 제안: 현재 구현이 적절해 보입니다.
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Hash Map / Hash Set, Greedy
- 설명: 해당 코드는 한 번의 해를 찾기 위해 숫자와 인덱스를 해시 맵에 저장하고, 각 원소에 대해 필요한 페어를 빠르게 조회하는 방식으로 동작한다. 이를 통해 선형 시간에 문제를 해결한다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 해시맵 활용으로 선형 시간에 해결하는 표준 풀이입니다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
|
@DaleStudy 승인 |
parkhojeong
left a comment
There was a problem hiding this comment.
다양한 방식으로 풀어보시려고 하신 것이 느껴져서 좋았던 거 같습니다. 수고하셨습니다 :)
| prev2 = 0 # 앞앞집 최대 수익 | ||
| prev1 = 0 # 앞집 최대 수익 | ||
|
|
||
| for num in nums: | ||
| # 현재 최대 수익은 | ||
| # 1) 앞집 수익 | ||
| # 2) 앞앞집 수익 + 현재수익 | ||
| curr = max(prev1, prev2 + num) | ||
|
|
||
| # 다음 턴을 위해 값을 슬라이딩(?) | ||
| # prev3 prev2 prev1 curr | ||
| # a b c | ||
| # a b c | ||
| prev2 = prev1 | ||
| prev1 = curr |
There was a problem hiding this comment.
| prev2 = 0 # 앞앞집 최대 수익 | |
| prev1 = 0 # 앞집 최대 수익 | |
| for num in nums: | |
| # 현재 최대 수익은 | |
| # 1) 앞집 수익 | |
| # 2) 앞앞집 수익 + 현재수익 | |
| curr = max(prev1, prev2 + num) | |
| # 다음 턴을 위해 값을 슬라이딩(?) | |
| # prev3 prev2 prev1 curr | |
| # a b c | |
| # a b c | |
| prev2 = prev1 | |
| prev1 = curr | |
| prev2 = 0 # 앞앞집 최대 수익 | |
| prev1 = 0 # 앞집 최대 수익 | |
| for num in nums: | |
| # 현재 최대 수익 | |
| curr = max(prev1, prev2 + num) | |
| prev2 = prev1 | |
| prev1 = curr |
로직이 직관적이어서 좋네요! prev1, prev2에 대한 주석은 선언 시점에만 있어도 잘 전달되는 것 같고 슬라이딩 관련된 로직은 주석이 없어도 충분히 의미가 전달되는 거 같습니다 :)
There was a problem hiding this comment.
다양한 풀이 시도해보신 것 멋지네요! most_common 은 몰랐는데 이런게 있군요! 덕분에 배워갑니다
제공되는 함수들이 실제로 어떻게 구현되어 있는지 살펴보는 것 좋은 거 같아요. 저도 파이썬의 sorted 구현체를 살펴보려고 합니다 :)
There was a problem hiding this comment.
두 풀이가 함께 있어서 가독성 비교하기 좋았던 거 같습니다!
답안 제출 문제
작성자 체크 리스트
In Review로 설정해주세요.검토자 체크 리스트
Important
본인 답안 제출 뿐만 아니라 다른 분 PR 하나 이상을 반드시 검토를 해주셔야 합니다!